μ΄ μ¬μΈ΅ κ°μ΄λλ₯Ό ν΅ν΄ μλ°μ€ν¬λ¦½νΈ μμ€ λ¨κ³ μν¬νΈμ κ°λ ₯ν κΈ°λ₯μ νμ©ν΄ 보μΈμ. Webpack, Rollup, esbuildμ κ°μ μΈκΈ° λΉλ λꡬμ μννκ² ν΅ν©νμ¬ μ½λ λͺ¨λμ±κ³Ό μ±λ₯μ ν₯μμν€λ λ°©λ²μ λ°°μ°μΈμ.
μλ°μ€ν¬λ¦½νΈ μμ€ λ¨κ³ μν¬νΈ: λΉλ λꡬ ν΅ν©μ μν μ’ ν© κ°μ΄λ
μλ°μ€ν¬λ¦½νΈμ λͺ¨λ μμ€ν μ CommonJSμ AMDμμλΆν° νμ¬ νμ€μΈ ES λͺ¨λμ μ΄λ₯΄κΈ°κΉμ§ μλ μ κ±Έμ³ ν¬κ² λ°μ ν΄ μμ΅λλ€. μμ€ λ¨κ³ μν¬νΈ(Source phase imports)λ μ΄λ¬ν μ§νμ λ€μ λ¨κ³λ₯Ό λννλ©°, λͺ¨λμ΄ λ‘λλκ³ μ²λ¦¬λλ λ°©μμ λν΄ λ ν° μ μ°μ±κ³Ό μ μ΄κΆμ μ 곡ν©λλ€. μ΄ κΈμμλ μμ€ λ¨κ³ μν¬νΈμ μΈκ³λ₯Ό κΉμ΄ νκ³ λ€μ΄, κ·Έκ²μ΄ 무μμΈμ§, μ΄λ€ μ΄μ μ΄ μλμ§, κ·Έλ¦¬κ³ Webpack, Rollup, esbuildμ κ°μ μΈκΈ° μλ μλ°μ€ν¬λ¦½νΈ λΉλ λꡬμ ν¨κ³Όμ μΌλ‘ ν΅ν©νλ λ°©λ²μ μ€λͺ ν©λλ€.
μμ€ λ¨κ³ μν¬νΈλ 무μμΈκ°?
μ ν΅μ μΈ μλ°μ€ν¬λ¦½νΈ λͺ¨λμ λ°νμμ λ‘λλκ³ μ€νλ©λλ€. λ°λ©΄μ μμ€ λ¨κ³ μν¬νΈλ λ°νμ μ΄μ μ μν¬νΈ νλ‘μΈμ€λ₯Ό μ‘°μν μ μλ λ©μ»€λμ¦μ μ 곡ν©λλ€. μ΄λ νμ€ λ°νμ μν¬νΈλ‘λ λΆκ°λ₯ν κ°λ ₯ν μ΅μ νμ λ³νμ κ°λ₯νκ² ν©λλ€.
μν¬νΈλ μ½λλ₯Ό μ§μ μ€ννλ λμ , μμ€ λ¨κ³ μν¬νΈλ μν¬νΈ κ·Έλνλ₯Ό κ²μ¬νκ³ μμ νκΈ° μν ν (hook)κ³Ό APIλ₯Ό μ 곡ν©λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ°μλ λ€μμ μνν μ μμ΅λλ€:
- λͺ¨λ μ§μ μ λμ ν΄κ²°: νκ²½ λ³μ, μ¬μ©μ μ νΈλ λλ κΈ°ν λ¬Έλ§₯μ μμΈμ λ°λΌ λ‘λν λͺ¨λμ κ²°μ ν©λλ€.
- λͺ¨λ μμ€ μ½λ λ³ν: μ½λκ° μ€νλκΈ° μ μ νΈλμ€νμΌλ§, μ΅μν λλ κ΅μ νμ κ°μ λ³νμ μ μ©ν©λλ€.
- μ¬μ©μ μ μ λͺ¨λ λ‘λ ꡬν: λ°μ΄ν°λ² μ΄μ€, μ격 API λλ κ°μ νμΌ μμ€ν κ³Ό κ°μ λΉνμ€ μμ€μμ λͺ¨λμ λ‘λν©λλ€.
- λͺ¨λ λ‘λ© μ΅μ ν: λͺ¨λ λ‘λ©μ μμμ νμ΄λ°μ μ μ΄νμ¬ μ±λ₯μ κ°μ ν©λλ€.
μμ€ λ¨κ³ μν¬νΈλ κ·Έ μμ²΄λ‘ μλ‘μ΄ λͺ¨λ νμμ΄ μλλΌ, κΈ°μ‘΄ λͺ¨λ μμ€ν λ΄μμ λͺ¨λ ν΄κ²° λ° λ‘λ© νλ‘μΈμ€λ₯Ό μ¬μ©μ μ μνκΈ° μν κ°λ ₯ν νλ μμν¬λ₯Ό μ 곡ν©λλ€.
μμ€ λ¨κ³ μν¬νΈμ μ΄μ
μμ€ λ¨κ³ μν¬νΈλ₯Ό ꡬννλ©΄ μλ°μ€ν¬λ¦½νΈ νλ‘μ νΈμ λͺ κ°μ§ μ€μν μ΄μ μ κ°μ Έμ¬ μ μμ΅λλ€:
- μ½λ λͺ¨λμ± ν₯μ: λͺ¨λ μ§μ μλ₯Ό λμ μΌλ‘ ν΄κ²°ν¨μΌλ‘μ¨ λ λͺ¨λνλκ³ μ μμ± μλ μ½λλ² μ΄μ€λ₯Ό λ§λ€ μ μμ΅λλ€. μλ₯Ό λ€μ΄, μ¬μ©μμ λ‘μΌμΌμ΄λ μ₯μΉ κΈ°λ₯μ λ°λΌ λ€λ₯Έ λͺ¨λμ λ‘λν μ μμ΅λλ€.
- μ±λ₯ κ°μ : μ΅μν λ° νΈλ¦¬ μμ΄νΉκ³Ό κ°μ μμ€ λ¨κ³ λ³νμ λ²λ€ ν¬κΈ°λ₯Ό ν¬κ² μ€μ΄κ³ λ‘λ© μκ°μ κ°μ ν μ μμ΅λλ€. λͺ¨λ λ‘λ© μμλ₯Ό μ μ΄νλ κ²λ μμ μ±λ₯μ μ΅μ νν μ μμ΅λλ€.
- μ μ°μ± μ¦λ: μ¬μ©μ μ μ λͺ¨λ λ‘λλ₯Ό μ¬μ©νλ©΄ λ λμ λ²μμ λ°μ΄ν° μμ€ λ° APIμ ν΅ν©ν μ μμ΅λλ€. μ΄λ λ°±μλ μμ€ν μ΄λ μΈλΆ μλΉμ€μ μνΈ μμ©ν΄μΌ νλ νλ‘μ νΈμ νΉν μ μ©ν μ μμ΅λλ€.
- νκ²½λ³ κ΅¬μ±: νκ²½ λ³μμ λ°λΌ λͺ¨λ μ§μ μλ₯Ό λμ μΌλ‘ ν΄κ²°νμ¬ κ°λ°, μ€ν μ΄μ§, νλ‘λμ λ± λ€μν νκ²½μ μ ν리μΌμ΄μ μ λμμ μ½κ² μ μ©ν μ μμ΅λλ€. μ΄λ μ¬λ¬ λΉλ ꡬμ±μ νμμ±μ μμ μ€λλ€.
- A/B ν μ€ν : μ¬μ©μ κ·Έλ£Ήμ λ°λΌ λ€λ₯Έ λ²μ μ λͺ¨λμ λμ μΌλ‘ μν¬νΈνμ¬ A/B ν μ€ν μ λ΅μ ꡬνν©λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μ κ²½νμ μ€ννκ³ μ΅μ νν μ μμ΅λλ€.
μμ€ λ¨κ³ μν¬νΈμ κ³Όμ
μμ€ λ¨κ³ μν¬νΈλ μλ§μ μ΄μ μ μ 곡νμ§λ§, λͺ κ°μ§ κ³Όμ λ μμ΅λλ€:
- 볡μ‘μ± μ¦κ°: μμ€ λ¨κ³ μν¬νΈλ₯Ό ꡬννλ©΄ λΉλ νλ‘μΈμ€μ 볡μ‘μ±μ΄ μΆκ°λ μ μμΌλ©° λͺ¨λ ν΄κ²° λ° λ‘λ©μ λν λ κΉμ μ΄ν΄κ° νμν©λλ€.
- λλ²κΉ μ μ΄λ €μ: λμ μΌλ‘ ν΄κ²°λκ±°λ λ³νλ λͺ¨λμ λλ²κΉ νλ κ²μ νμ€ λͺ¨λμ λλ²κΉ νλ κ²λ³΄λ€ λ μ΄λ €μΈ μ μμ΅λλ€. μ μ ν λꡬμ λ‘κΉ μ΄ νμμ μ λλ€.
- λΉλ λꡬ μμ‘΄μ±: μμ€ λ¨κ³ μν¬νΈλ μΌλ°μ μΌλ‘ λΉλ λꡬ νλ¬κ·ΈμΈμ΄λ μ¬μ©μ μ μ λ‘λμ μμ‘΄ν©λλ€. μ΄λ νΉμ λΉλ λꡬμ λν μμ‘΄μ±μ μμ±νκ³ λꡬ κ° μ νμ λ μ΄λ ΅κ² λ§λ€ μ μμ΅λλ€.
- νμ΅ κ³‘μ : κ°λ°μλ μμ€ λ¨κ³ μν¬νΈλ₯Ό ꡬννκΈ° μν΄ μ νν λΉλ λκ΅¬κ° μ 곡νλ νΉμ API λ° κ΅¬μ± μ΅μ μ λ°°μμΌ ν©λλ€.
- κ³Όλν μμ§λμ΄λ§μ κ°λ₯μ±: νλ‘μ νΈμ μμ€ λ¨κ³ μν¬νΈκ° μ λ§λ‘ νμνμ§ μ μ€νκ² κ³ λ €νλ κ²μ΄ μ€μν©λλ€. μ΄λ₯Ό λ¨μ©νλ©΄ λΆνμν 볡μ‘μ±μΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
λΉλ λꡬμ μμ€ λ¨κ³ μν¬νΈ ν΅ν©νκΈ°
λͺλͺ μΈκΈ° μλ μλ°μ€ν¬λ¦½νΈ λΉλ λꡬλ νλ¬κ·ΈμΈμ΄λ μ¬μ©μ μ μ λ‘λλ₯Ό ν΅ν΄ μμ€ λ¨κ³ μν¬νΈλ₯Ό μ§μν©λλ€. Webpack, Rollup, esbuildμ ν΅ν©νλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€.
Webpack
Webpackμ κ°λ ₯νκ³ κ³ λλ‘ κ΅¬μ± κ°λ₯ν λͺ¨λ λ²λ€λ¬μ λλ€. λ‘λμ νλ¬κ·ΈμΈμ ν΅ν΄ μμ€ λ¨κ³ μν¬νΈλ₯Ό μ§μν©λλ€. Webpackμ λ‘λ λ©μ»€λμ¦μ μ¬μ©νλ©΄ λΉλ νλ‘μΈμ€ μ€μ κ°λ³ λͺ¨λμ λ³νν μ μμ΅λλ€. νλ¬κ·ΈμΈμ λΉλ λΌμ΄νμ¬μ΄ν΄μ λ€μν λ¨κ³μ κ°μ νμ¬ λ 볡μ‘ν μ¬μ©μ μ μλ₯Ό κ°λ₯νκ² ν©λλ€.
μμ : μμ€ μ½λ λ³νμ μν Webpack λ‘λ μ¬μ©νκΈ°
μλ₯Ό λ€μ΄, μ¬μ©μ μ μ λ‘λλ₯Ό μ¬μ©νμ¬ μ½λ λ΄μ λͺ¨λ `__VERSION__`μ `package.json` νμΌμμ μ½μ΄μ¨ νμ¬ μ ν리μΌμ΄μ λ²μ μΌλ‘ λ°κΎΈκ³ μΆλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€. λ€μκ³Ό κ°μ΄ ν μ μμ΅λλ€:
- μ¬μ©μ μ μ λ‘λ μμ±νκΈ°:
// webpack-version-loader.js
const { readFileSync } = require('fs');
const path = require('path');
module.exports = function(source) {
const packageJsonPath = path.resolve(__dirname, 'package.json');
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
const version = packageJson.version;
const modifiedSource = source.replace(/__VERSION__/g, version);
return modifiedSource;
};
- λ‘λλ₯Ό μ¬μ©νλλ‘ Webpack ꡬμ±νκΈ°:
// webpack.config.js
module.exports = {
// ... other configurations
module: {
rules: [
{
test: /\.js$/,
use: [
{
loader: path.resolve(__dirname, 'webpack-version-loader.js')
}
]
}
]
}
};
- μ½λμμ `__VERSION__` νλ μ΄μ€νλ μ¬μ©νκΈ°:
// my-module.js
console.log('Application Version:', __VERSION__);
Webpackμ΄ νλ‘μ νΈλ₯Ό λΉλν λ, `webpack-version-loader.js`κ° λͺ¨λ μλ°μ€ν¬λ¦½νΈ νμΌμ μ μ©λμ΄ `__VERSION__`μ `package.json`μ μ€μ λ²μ μΌλ‘ λ체ν©λλ€. μ΄λ λΉλ λ¨κ³μμ μμ€ μ½λ λ³νμ μννκΈ° μν΄ λ‘λλ₯Ό μ¬μ©νλ λ°©λ²μ κ°λ¨ν μμ λλ€.
μμ : λμ λͺ¨λ ν΄κ²°μ μν Webpack νλ¬κ·ΈμΈ μ¬μ©νκΈ°
Webpack νλ¬κ·ΈμΈμ νκ²½ λ³μμ λ°λΌ λͺ¨λ μ§μ μλ₯Ό λμ μΌλ‘ ν΄κ²°νλ κ²κ³Ό κ°μ λ 볡μ‘ν μμ μ μ¬μ©λ μ μμ΅λλ€. νκ²½(κ°λ°, μ€ν μ΄μ§, νλ‘λμ )μ λ°λΌ λ€λ₯Έ κ΅¬μ± νμΌμ λ‘λνλ €λ μλ리μ€λ₯Ό κ³ λ €ν΄ λ³΄μΈμ.
- μ¬μ©μ μ μ νλ¬κ·ΈμΈ μμ±νκΈ°:
// webpack-environment-plugin.js
class EnvironmentPlugin {
constructor(options) {
this.options = options || {};
}
apply(compiler) {
compiler.hooks.normalModuleFactory.tap('EnvironmentPlugin', (factory) => {
factory.hooks.resolve.tapAsync('EnvironmentPlugin', (data, context, callback) => {
if (data.request === '@config') {
const environment = process.env.NODE_ENV || 'development';
const configPath = `./config/${environment}.js`;
data.request = path.resolve(__dirname, configPath);
}
callback(null, data);
});
});
}
}
module.exports = EnvironmentPlugin;
- νλ¬κ·ΈμΈμ μ¬μ©νλλ‘ Webpack ꡬμ±νκΈ°:
// webpack.config.js
const EnvironmentPlugin = require('./webpack-environment-plugin.js');
const path = require('path');
module.exports = {
// ... other configurations
plugins: [
new EnvironmentPlugin()
],
resolve: {
alias: {
'@config': path.resolve(__dirname, 'config/development.js') // Default alias, might be overridden by the plugin
}
}
};
- μ½λμμ `@config` μν¬νΈνκΈ°:
// my-module.js
import config from '@config';
console.log('Configuration:', config);
μ΄ μμ μμ `EnvironmentPlugin`μ `@config`μ λν λͺ¨λ ν΄κ²° νλ‘μΈμ€λ₯Ό κ°λ‘μ±λλ€. `NODE_ENV` νκ²½ λ³μλ₯Ό νμΈνκ³ λͺ¨λμ μ μ ν κ΅¬μ± νμΌ(μ: `config/development.js`, `config/staging.js`, `config/production.js`)λ‘ λμ μΌλ‘ ν΄κ²°ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ½λλ₯Ό μμ νμ§ μκ³ λ λ€λ₯Έ κ΅¬μ± κ°μ μ½κ² μ νν μ μμ΅λλ€.
Rollup
Rollupμ λ λ€λ₯Έ μΈκΈ° μλ μλ°μ€ν¬λ¦½νΈ λͺ¨λ λ²λ€λ¬λ‘, κ³ λλ‘ μ΅μ νλ λ²λ€μ μμ±νλ λ₯λ ₯μΌλ‘ μ λͺ ν©λλ€. μ΄ μμ νλ¬κ·ΈμΈμ ν΅ν΄ μμ€ λ¨κ³ μν¬νΈλ₯Ό μ§μν©λλ€. Rollupμ νλ¬κ·ΈμΈ μμ€ν μ κ°λ¨νκ³ μ μ°νκ² μ€κ³λμ΄ μμ΄ λ€μν λ°©μμΌλ‘ λΉλ νλ‘μΈμ€λ₯Ό μ¬μ©μ μ μν μ μμ΅λλ€.
μμ : λμ μν¬νΈ μ²λ¦¬λ₯Ό μν Rollup νλ¬κ·ΈμΈ μ¬μ©νκΈ°
μ¬μ©μμ λΈλΌμ°μ μ λ°λΌ λͺ¨λμ λμ μΌλ‘ μν¬νΈν΄μΌ νλ μλ리μ€λ₯Ό μκ°ν΄ λ³΄κ² μ΅λλ€. Rollup νλ¬κ·ΈμΈμ μ¬μ©νμ¬ μ΄λ₯Ό λ¬μ±ν μ μμ΅λλ€.
- μ¬μ©μ μ μ νλ¬κ·ΈμΈ μμ±νκΈ°:
// rollup-browser-plugin.js
import { browser } from 'webextension-polyfill';
export default function browserPlugin() {
return {
name: 'browser-plugin',
resolveId(source, importer) {
if (source === 'browser') {
return {
id: 'browser-polyfill',
moduleSideEffects: true, // Ensure polyfill is included
};
}
return null; // Let Rollup handle other imports
},
load(id) {
if (id === 'browser-polyfill') {
return `export default ${JSON.stringify(browser)};`;
}
return null;
},
};
}
- νλ¬κ·ΈμΈμ μ¬μ©νλλ‘ Rollup ꡬμ±νκΈ°:
// rollup.config.js
import browserPlugin from './rollup-browser-plugin.js';
export default {
// ... other configurations
plugins: [
browserPlugin()
]
};
- μ½λμμ `browser` μν¬νΈνκΈ°:
// my-module.js
import browser from 'browser';
console.log('Browser Info:', browser.name);
μ΄ νλ¬κ·ΈμΈμ `browser` λͺ¨λμ μν¬νΈλ₯Ό κ°λ‘μ±κ³ , μΉ νμ₯ APIλ₯Ό μν ν΄λ¦¬ν(νμν κ²½μ°)λ‘ λ체νμ¬ μ¬λ¬ λΈλΌμ°μ μμ μΌκ΄λ μΈν°νμ΄μ€λ₯Ό ν¨κ³Όμ μΌλ‘ μ 곡ν©λλ€. μ΄λ Rollup νλ¬κ·ΈμΈμ μ¬μ©νμ¬ λμ μΌλ‘ μν¬νΈλ₯Ό μ²λ¦¬νκ³ μ½λλ₯Ό λ€λ₯Έ νκ²½μ λ§κ² μ‘°μ νλ λ°©λ²μ 보μ¬μ€λλ€.
esbuild
esbuildλ λ°μ΄λ μλλ‘ μ λͺ ν λΉκ΅μ μλ‘μ΄ μλ°μ€ν¬λ¦½νΈ λ²λ€λ¬μ λλ€. ν΅μ¬μ Goλ‘ μμ±νκ³ λΉλ νλ‘μΈμ€λ₯Ό λ³λ ¬ννλ λ±μ κΈ°μ μ‘°ν©μ ν΅ν΄ μ΄ μλλ₯Ό λ¬μ±ν©λλ€. esbuildλ νλ¬κ·ΈμΈμ ν΅ν΄ μμ€ λ¨κ³ μν¬νΈλ₯Ό μ§μνμ§λ§, νλ¬κ·ΈμΈ μμ€ν μ μμ§ λ°μ μ€μ λλ€.
μμ : νκ²½ λ³μ λ체λ₯Ό μν esbuild νλ¬κ·ΈμΈ μ¬μ©νκΈ°
μμ€ λ¨κ³ μν¬νΈμ μΌλ°μ μΈ μ¬μ© μ¬λ‘ μ€ νλλ λΉλ νλ‘μΈμ€ μ€μ νκ²½ λ³μλ₯Ό λ체νλ κ²μ λλ€. esbuild νλ¬κ·ΈμΈμ μ¬μ©νμ¬ λ€μκ³Ό κ°μ΄ ν μ μμ΅λλ€:
- μ¬μ©μ μ μ νλ¬κ·ΈμΈ μμ±νκΈ°:
// esbuild-env-plugin.js
const esbuild = require('esbuild');
function envPlugin(env) {
return {
name: 'env',
setup(build) {
build.onLoad({ filter: /\.js$/ }, async (args) => {
let contents = await fs.promises.readFile(args.path, 'utf8');
for (const k in env) {
contents = contents.replace(new RegExp(`process\.env\.${k}`, 'g'), JSON.stringify(env[k]));
}
return {
contents: contents,
loader: 'js',
};
});
},
};
}
module.exports = envPlugin;
- νλ¬κ·ΈμΈμ μ¬μ©νλλ‘ esbuild ꡬμ±νκΈ°:
// build.js
const esbuild = require('esbuild');
const envPlugin = require('./esbuild-env-plugin.js');
const fs = require('fs');
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outfile: 'dist/bundle.js',
plugins: [envPlugin(process.env)],
platform: 'browser',
format: 'esm',
}).catch(() => process.exit(1));
- μ½λμμ `process.env` μ¬μ©νκΈ°:
// src/index.js
console.log('Environment:', process.env.NODE_ENV);
console.log('API URL:', process.env.API_URL);
μ΄ νλ¬κ·ΈμΈμ `process.env` κ°μ²΄μ μ 곡λ νκ²½ λ³μλ€μ μννλ©° `process.env.VARIABLE_NAME`μ λͺ¨λ λ°μμ ν΄λΉ κ°μΌλ‘ λ체ν©λλ€. μ΄λ₯Ό ν΅ν΄ λΉλ νλ‘μΈμ€ μ€μ νκ²½λ³ κ΅¬μ±μ μ½λμ μ£Όμ ν μ μμ΅λλ€. `fs.promises.readFile`μ νμΌ λ΄μ©μ λΉλκΈ°μ μΌλ‘ μ½λλ‘ λ³΄μ₯νλ©°, μ΄λ Node.js μμ μ λͺ¨λ² μ¬λ‘μ λλ€.
κ³ κΈ μ¬μ© μ¬λ‘ λ° κ³ λ € μ¬ν
κΈ°λ³Έμ μΈ μμ λ₯Ό λμ΄μ, μμ€ λ¨κ³ μν¬νΈλ λ€μκ³Ό κ°μ λ€μν κ³ κΈ μ¬μ© μ¬λ‘μ μ¬μ©λ μ μμ΅λλ€:
- κ΅μ ν(i18n): μ¬μ©μμ μΈμ΄ μ νΈλμ λ°λΌ λ‘μΌμΌλ³ λͺ¨λμ λμ μΌλ‘ λ‘λν©λλ€.
- κΈ°λ₯ νλκ·Έ: νκ²½ λ³μλ μ¬μ©μ κ·Έλ£Ήμ λ°λΌ κΈ°λ₯μ νμ±ννκ±°λ λΉνμ±νν©λλ€.
- μ½λ λΆν : νμμ λ°λΌ λ‘λλλ λ μμ λ²λ€μ μμ±νμ¬ μ΄κΈ° λ‘λ© μκ°μ κ°μ ν©λλ€. μ ν΅μ μΈ μ½λ λΆν μ λ°νμ μ΅μ νμ΄μ§λ§, μμ€ λ¨κ³ μν¬νΈλ λΉλ μ λ μΈλΆνλ μ μ΄μ λΆμμ νμ©ν©λλ€.
- ν΄λ¦¬ν(Polyfills): λμ λΈλΌμ°μ λ νκ²½μ λ°λΌ 쑰건λΆλ‘ ν΄λ¦¬νμ ν¬ν¨ν©λλ€.
- μ¬μ©μ μ μ λͺ¨λ νμ: JSON, YAML λλ μ¬μ©μ μ μ DSLκ³Ό κ°μ λΉνμ€ λͺ¨λ νμμ μ§μν©λλ€.
μμ€ λ¨κ³ μν¬νΈλ₯Ό ꡬνν λλ λ€μ μ¬νμ κ³ λ €νλ κ²μ΄ μ€μν©λλ€:
- μ±λ₯: λΉλ νλ‘μΈμ€λ₯Ό λλ¦¬κ² ν μ μλ 볡μ‘νκ±°λ κ³μ° λΉμ©μ΄ λ§μ΄ λλ λ³νμ νΌν©λλ€.
- μ μ§λ³΄μμ±: μ¬μ©μ μ μ λ‘λμ νλ¬κ·ΈμΈμ κ°λ¨νκ³ μ λ¬Έμννμ¬ μ μ§ν©λλ€.
- ν μ€νΈ μ©μ΄μ±: λ¨μ ν μ€νΈλ₯Ό μμ±νμ¬ μμ€ λ¨κ³ λ³νμ΄ μ¬λ°λ₯΄κ² μλνλμ§ νμΈν©λλ€.
- 보μ: μ λ’°ν μ μλ μμ€μμ λͺ¨λμ λ‘λν λλ 보μ μ·¨μ½μ μ μ λ°ν μ μμΌλ―λ‘ μ£Όμν΄μΌ ν©λλ€.
- λΉλ λꡬ νΈνμ±: μμ€ λ¨κ³ λ³νμ΄ μ¬μ© μ€μΈ λΉλ λꡬμ λ€λ₯Έ λ²μ κ³Ό νΈνλλμ§ νμΈν©λλ€.
κ²°λ‘
μμ€ λ¨κ³ μν¬νΈλ μλ°μ€ν¬λ¦½νΈ λͺ¨λ λ‘λ© νλ‘μΈμ€λ₯Ό μ¬μ©μ μ μνλ κ°λ ₯νκ³ μ μ°ν λ°©λ²μ μ 곡ν©λλ€. Webpack, Rollup, esbuildμ κ°μ λΉλ λꡬμ ν΅ν©ν¨μΌλ‘μ¨ μ½λ λͺ¨λμ±, μ±λ₯, μ μμ±μμ μλΉν κ°μ μ μ΄λ£° μ μμ΅λλ€. μ½κ°μ 볡μ‘μ±μ λλ°νμ§λ§, κ³ κΈ μ¬μ©μ μ μλ μ΅μ νκ° νμν νλ‘μ νΈμλ κ·Έ μ΄μ μ΄ μλΉν μ μμ΅λλ€. νλ‘μ νΈμ μꡬ μ¬νμ μ μ€νκ² κ³ λ €νκ³ λΉλ νλ‘μΈμ€μ μμ€ λ¨κ³ μν¬νΈλ₯Ό ν΅ν©νκΈ° μν μ¬λ°λ₯Έ μ κ·Ό λ°©μμ μ ννμΈμ. μ½λλ² μ΄μ€κ° κ²¬κ³ νκ³ μ λ’°ν μ μλλ‘ μ μ§λ³΄μμ±, ν μ€νΈ μ©μ΄μ±, 보μμ μ°μ μνλ κ²μ μμ§ λ§μΈμ. μλ°μ€ν¬λ¦½νΈ νλ‘μ νΈμμ μμ€ λ¨κ³ μν¬νΈμ λͺ¨λ μ μ¬λ ₯μ μ€ννκ³ , νμνκ³ , λ°νν΄ λ³΄μΈμ. νλ μΉ κ°λ°μ λμ μΈ νΉμ±μ μ μμ±μ νμλ‘ νλ©°, μ΄λ¬ν κΈ°μ μ μ΄ν΄νκ³ κ΅¬ννλ κ²μ κΈλ‘λ² νκ²½μμ μ¬λ¬λΆμ νλ‘μ νΈλ₯Ό μ°¨λ³νν μ μμ΅λλ€.